﻿// --------------------------------------------------
// UnityInjector - ConsoleEncoding.PInvoke.cs
// Copyright (c) Usagirei 2015 - 2015
// --------------------------------------------------

using System;
using System.Runtime.InteropServices;

namespace UnityInjector.ConsoleUtil
{
    // --------------------------------------------------
    // Code ported from
    // https://gist.github.com/asm256/9bfb88336a1433e2328a
    // Which in turn was seemingly ported from
    // http://jonskeet.uk/csharp/ebcdic/
    // using only safe (managed) code
    // --------------------------------------------------
    internal partial class ConsoleEncoding
    {
        [DllImport("kernel32.dll")]
        private static extern uint GetConsoleOutputCP();

        [DllImport("kernel32.dll")]
        private static extern uint GetACP();

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int MultiByteToWideChar(uint codePage,
                                                      uint dwFlags,
                                                      [In] [MarshalAs(UnmanagedType.LPArray)]
                                                      byte[] lpMultiByteStr,
                                                      int cbMultiByte,
                                                      [Out] [MarshalAs(UnmanagedType.LPWStr)]
                                                      char[] lpWideCharStr,
                                                      int cchWideChar);

        [DllImport("kernel32.dll")]
        private static extern IntPtr SetConsoleOutputCP(uint codepage);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int WideCharToMultiByte(uint codePage,
                                                      uint dwFlags,
                                                      [In] [MarshalAs(UnmanagedType.LPWStr)] char[] lpWideCharStr,
                                                      int cchWideChar,
                                                      [Out] [MarshalAs(UnmanagedType.LPArray)]
                                                      byte[] lpMultiByteStr,
                                                      int cbMultiByte,
                                                      IntPtr lpDefaultChar,
                                                      IntPtr lpUsedDefaultChar);
    }
}
